package org.projectodd.polyglot.stomp;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import org.apache.catalina.connector.Connector;
import org.apache.coyote.ProtocolHandler;
import org.jboss.logging.Logger;
import org.jboss.msc.inject.Injector;
import org.jboss.msc.service.Service;
import org.jboss.msc.service.StartContext;
import org.jboss.msc.service.StartException;
import org.jboss.msc.service.StopContext;
import org.jboss.msc.value.InjectedValue;
public class SSLContextService implements Service<SSLContext> {
@Override
public SSLContext getValue() throws IllegalStateException, IllegalArgumentException {
return this.sslContext;
}
@Override
public void start(StartContext context) throws StartException {
Connector connector = connectorInjector.getValue();
ProtocolHandler handler = connector.getProtocolHandler();
String keystorePath = (String) handler.getAttribute( "keystore" );
String keystorePassword = (String) handler.getAttribute( "keypass" );
String keystoreType = (String) handler.getAttribute( "keystoreType" );
String protocols = (String) handler.getAttribute( "protocols" );
String algorithm = (String) handler.getAttribute( "algorithm" );
if ( protocols == null ) {
protocols = "TLS";
}
if ( keystoreType == null) {
keystoreType = "JKS";
}
if ( algorithm == null ) {
algorithm = "SunX509";
}
try {
this.sslContext = SSLContext.getInstance( protocols );
KeyStore keyStore = KeyStore.getInstance( keystoreType );
InputStream stream = new FileInputStream( keystorePath );
try {
keyStore.load( stream, keystorePassword.toCharArray() );
} finally {
stream.close();
}
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance( algorithm );
keyManagerFactory.init( keyStore, keystorePassword.toCharArray() );
this.sslContext.init( keyManagerFactory.getKeyManagers(), null, null );
} catch (NoSuchAlgorithmException e) {
throw new StartException( e );
} catch (KeyManagementException e) {
throw new StartException( e );
} catch (KeyStoreException e) {
throw new StartException( e );
} catch (UnrecoverableKeyException e) {
throw new StartException( e );
} catch (FileNotFoundException e) {
throw new StartException( e );
} catch (CertificateException e) {
throw new StartException( e );
} catch (IOException e) {
throw new StartException( e );
}
}
@Override
public void stop(StopContext context) {
this.sslContext = null;
}
public Injector<Connector> getWebConnectorInjector() {
return this.connectorInjector;
}
private SSLContext sslContext;
private InjectedValue<Connector> connectorInjector = new InjectedValue<Connector>();
static final Logger log = Logger.getLogger( "org.projectodd.polyglot.stomp.as" );
}